Telegram Group & Telegram Channel
🧠 SQL-задача с подвохом: “Самый активный — или самый невидимый?”

📘 Условие

У тебя есть две таблицы:


users(id, name)
posts(id, user_id, title)


Вопрос:
Выведи всех пользователей, у которых нет ни одного поста,
а также пользователя, у которого больше всего постов.

📌 Но — в одном запросе.

Попробуй решить задачу таким SQL:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0 OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT COUNT(*) AS cnt
FROM posts
GROUP BY user_id
) t
);


🔍 Вопрос:

1) Почему он может вернуть неправильный результат?
2) В чём разница между COUNT(*) и COUNT(p.id)?
3) Как переписать его правильно?

Разбор подвоха

💣 Подвох 1: COUNT(p.id) пропускает NULL

Когда ты делаешь LEFT JOIN, для пользователей без постов p.id = NULL.

COUNT(*) считает все строки (включая NULL)
COUNT(p.id) не считает строки, где p.id IS NULL

👉 Это может привести к тому, что:
COUNT(p.id) = 0 — действительно "нет постов"
• но в подзапросе SELECT COUNT(*) считает иначе и даёт искаженную MAX(cnt)

🔁 Как правильно:

1) Подзапрос должен использовать COUNT(p.id), чтобы сравнение было честным
2) Либо использовать JOIN вместо LEFT JOIN в подзапросе, чтобы не попасть на "нулевых" пользователей

Финальный корректный запрос:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0
OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT user_id, COUNT(p.id) AS cnt
FROM posts
GROUP BY user_id
) AS ranked
);


🎯 Такой запрос честно покажет:

• Всех “молчунов” (0 постов)
• И самого активного автора (макс постов)

📌 Отлично подходит для собеседования или тех, кто считает, что "GROUP BY — это просто".
@sqlhub



tg-me.com/sqlhub/1877
Create:
Last Update:

🧠 SQL-задача с подвохом: “Самый активный — или самый невидимый?”

📘 Условие

У тебя есть две таблицы:


users(id, name)
posts(id, user_id, title)


Вопрос:
Выведи всех пользователей, у которых нет ни одного поста,
а также пользователя, у которого больше всего постов.

📌 Но — в одном запросе.

Попробуй решить задачу таким SQL:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0 OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT COUNT(*) AS cnt
FROM posts
GROUP BY user_id
) t
);


🔍 Вопрос:

1) Почему он может вернуть неправильный результат?
2) В чём разница между COUNT(*) и COUNT(p.id)?
3) Как переписать его правильно?

Разбор подвоха

💣 Подвох 1: COUNT(p.id) пропускает NULL

Когда ты делаешь LEFT JOIN, для пользователей без постов p.id = NULL.

COUNT(*) считает все строки (включая NULL)
COUNT(p.id) не считает строки, где p.id IS NULL

👉 Это может привести к тому, что:
COUNT(p.id) = 0 — действительно "нет постов"
• но в подзапросе SELECT COUNT(*) считает иначе и даёт искаженную MAX(cnt)

🔁 Как правильно:

1) Подзапрос должен использовать COUNT(p.id), чтобы сравнение было честным
2) Либо использовать JOIN вместо LEFT JOIN в подзапросе, чтобы не попасть на "нулевых" пользователей

Финальный корректный запрос:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0
OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT user_id, COUNT(p.id) AS cnt
FROM posts
GROUP BY user_id
) AS ranked
);


🎯 Такой запрос честно покажет:

• Всех “молчунов” (0 постов)
• И самого активного автора (макс постов)

📌 Отлично подходит для собеседования или тех, кто считает, что "GROUP BY — это просто".
@sqlhub

BY Data Science. SQL hub


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/sqlhub/1877

View MORE
Open in Telegram


Data Science SQL hub Telegram | DID YOU KNOW?

Date: |

Find Channels On Telegram?

Telegram is an aspiring new messaging app that’s taking the world by storm. The app is free, fast, and claims to be one of the safest messengers around. It allows people to connect easily, without any boundaries.You can use channels on Telegram, which are similar to Facebook pages. If you’re wondering how to find channels on Telegram, you’re in the right place. Keep reading and you’ll find out how. Also, you’ll learn more about channels, creating channels yourself, and the difference between private and public Telegram channels.

Look for Channels Online

You guessed it – the internet is your friend. A good place to start looking for Telegram channels is Reddit. This is one of the biggest sites on the internet, with millions of communities, including those from Telegram.Then, you can search one of the many dedicated websites for Telegram channel searching. One of them is telegram-group.com. This website has many categories and a really simple user interface. Another great site is telegram channels.me. It has even more channels than the previous one, and an even better user experience.These are just some of the many available websites. You can look them up online if you’re not satisfied with these two. All of these sites list only public channels. If you want to join a private channel, you’ll have to ask one of its members to invite you.

Data Science SQL hub from ye


Telegram Data Science. SQL hub
FROM USA